/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author Christopher
 */
import java.util.ArrayList;
import java.util.InputMismatchException;
import java.util.List;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Driver {
    /**
     * 
     * @param args 
     */
    public static void main(String args[]){
        List<Cliente> evento = new ArrayList<Cliente>();
        ColaAbstracta<Cliente> caja1;
        ColaAbstracta<Cliente> caja2;
        ColaAbstracta<Cliente> caja3; 
        ColaAbstracta<Cliente> caja4;
        Cliente mi_cliente;
        int op1, op2, tiempoE, tiempot;
       int sa= 0;
        do{
            menu();
            op1 = (int)obtenerNumero("Elija una opción: ", true);

            switch(op1){
                case 1:
                    caja1 = new Array<Cliente>();
                    caja2 = new Array<Cliente>();
                    caja3 = new Array<Cliente>();
                    caja4 = new Array<Cliente>();

                    tiempoE = (int)obtenerNumero("Ingrese tiempo de entrada del cliente No. 1: ", true);
                   
                    
                    for(int x = 1; tiempoE>0; x++){
                        mi_cliente = new Cliente();
                        
                        evento.add(mi_cliente);
                        
                        tiempoE = (int)obtenerNumero("Ingrese tiempo de entrada del cliente No. " + (x+1)+ " o un negativo para finalizar : ",true);
                        mi_cliente.setTiempoE(tiempoE);
                        mi_cliente.setTiempoO();
                        mi_cliente.setTiempoS();
                    }
                    
                    
                    for(int i = 0; i<evento.size(); i++){
                        mi_cliente = new Cliente();
                        mi_cliente = (Cliente)evento.get(i);
                        int [] mis_tamanos = new int[4];
                        int menor;
                        mis_tamanos[0] = caja1.size();
                        mis_tamanos[1] = caja2.size();
                        mis_tamanos[2] = caja3.size();
                        mis_tamanos[3] = caja4.size();

                        
                       menor = getValMin(mis_tamanos);
                       switch(menor){
                           case 0:
                               caja1.offer(mi_cliente);
                               mi_cliente.setCola(1);
                               mi_cliente.setTiempoT(sa);
                               sa = mi_cliente.getTiempoT();
                               System.out.println(mi_cliente);
                               break;
                               
                           case 1:
                               caja2.offer(mi_cliente);
                               mi_cliente.setTiempoT(sa);
                               sa = mi_cliente.getTiempoT();
                               mi_cliente.setCola(2);
                               System.out.println(mi_cliente);
                               break;
                                   
                           case 2:
                               caja3.offer(mi_cliente);
                               mi_cliente.setTiempoT(sa);
                               sa = mi_cliente.getTiempoT();
                               mi_cliente.setCola(3);
                               System.out.println(mi_cliente);
                               System.out.println(mi_cliente);
                               break;
                           case 3:
                               caja4.offer(mi_cliente);
                               mi_cliente.setTiempoT(sa);
                               sa = mi_cliente.getTiempoT();
                               mi_cliente.setCola(4);
                               System.out.println(mi_cliente);
                               break;
                       }
                       
                    }
                    for(int a = 0; a<evento.size(); a++){
                        mi_cliente = new Cliente();
                        
                        if(caja1.peek() != null || caja2.peek() != null || caja3.peek() != null || caja4.peek() != null){
                            try{
                                if((caja1.peek().getTiempoS() == mi_cliente.getTiempoE())){
                                    caja1.peek().setEstado(false);
                                    caja1.poll();
                                    System.out.println(caja1.peek());
                                }
                                if(caja2.peek().getTiempoS() == mi_cliente.getTiempoE()){
                                    caja2.peek().setEstado(false);
                                    caja2.poll();
                                    System.out.println(caja2.peek());
                                }
                                if(caja3.peek().getTiempoS() == mi_cliente.getTiempoE()){
                                    caja3.peek().setEstado(false);
                                    caja3.poll();
                                    System.out.println(caja3.peek());
                                }
                                if(caja4.peek().getTiempoS() == mi_cliente.getTiempoE()){
                                    caja4.peek().setEstado(false);
                                    caja4.poll();
                                    System.out.println(caja4.peek());
                                }
                            }catch(NullPointerException e){}
                    }
                
                }
                    break;  
                case 2:
                    System.out.println("No me dio Tiempo");
                    System.out.println(":0(");
    //                caja1 = new CircularArray<Cliente>();
    //                caja2 = new CircularArray<Cliente>();
    //                caja3 = new CircularArray<Cliente>();
    //                caja4 = new CircularArray<Cliente>();
    //                op2 = (int)obtenerNumero("Ingrese la cantidad de clientes: ", true);
    //                for(int x = 0; x<op2; x++){
    //                    mi_cliente = new Cliente();
    //                    try {
    //                        evento.offer(mi_cliente);
    //                    } catch (Exception ex) {
    //                        Logger.getLogger(Driver.class.getName()).log(Level.SEVERE, null, ex);
    //                    }
    //                    tiempoE = (int)obtenerNumero("Ingrese tiempo de entrada del cliente No. " + (x+1)+ " : ",true);
    //                    mi_cliente.setTiempoE(tiempoE);
    //                    mi_cliente.setTiempoO();
    //                    mi_cliente.setTiempoS();
    //                }
    //                for(int i = 0; i<op2; i++){
    //                    mi_cliente = new Cliente();
    //                    mi_cliente = evento.poll();
    //                    if(caja1.pick().getTiempoS() == mi_cliente.getTiempoE()){
    //                        caja1.pick().setEstado(false);
    //                        caja1.poll();
    //                    }
    //                    if(caja2.pick().getTiempoS() == mi_cliente.getTiempoE()){
    //                        caja2.pick().setEstado(false);
    //                        caja2.poll();
    //                    }
    //                    if(caja3.pick().getTiempoS() == mi_cliente.getTiempoE()){
    //                        caja3.pick().setEstado(false);
    //                        caja3.poll();
    //                    }
    //                    if(caja4.pick().getTiempoS() == mi_cliente.getTiempoE()){
    //                        caja4.pick().setEstado(false);
    //                        caja4.poll();
    //                    }
    //                    
    //                    if(caja1.size()<=caja2.size() && caja1.size()<=caja3.size() && caja1.size()<=caja4.size()){
    //                        if(mi_cliente != caja2.pick() && mi_cliente != caja3.pick() && mi_cliente != caja4.pick()){
    //                            try {
    //                                caja1.offer(mi_cliente);
    //                            } catch (Exception ex) {
    //                                Logger.getLogger(Driver.class.getName()).log(Level.SEVERE, null, ex);
    //                            }
    //                        }
    //                    }
    //                    if(caja2.size()<=caja1.size() && caja2.size()<=caja3.size() && caja2.size()<=caja4.size()){
    //                        if(mi_cliente != caja1.pick() && mi_cliente != caja3.pick() && mi_cliente != caja4.pick()){
    //                            try {
    //                                caja2.offer(mi_cliente);
    //                            } catch (Exception ex) {
    //                                Logger.getLogger(Driver.class.getName()).log(Level.SEVERE, null, ex);
    //                            }
    //                        }
    //                    }
    //                    if(caja3.size()<=caja1.size() && caja3.size()<=caja2.size() && caja3.size()<=caja4.size()){
    //                        if(mi_cliente != caja1.pick() && mi_cliente != caja2.pick() && mi_cliente != caja4.pick()){
    //                            try {
    //                                caja3.offer(mi_cliente);
    //                            } catch (Exception ex) {
    //                                Logger.getLogger(Driver.class.getName()).log(Level.SEVERE, null, ex);
    //                            }
    //                        }
    //                    }
    //                    if(caja4.size()<=caja1.size() && caja4.size()<=caja2.size() && caja4.size()<=caja3.size()){
    //                        if(mi_cliente != caja1.pick() && mi_cliente != caja2.pick() && mi_cliente != caja3.pick()){
    //                            try {
    //                                caja4.offer(mi_cliente);
    //                            } catch (Exception ex) {
    //                                Logger.getLogger(Driver.class.getName()).log(Level.SEVERE, null, ex);
    //                            }
    //                        }
    //                    }
    //                }
                    break;   
                case 3:
                    System.out.println("Despedida!!!");
                    System.out.println();
                    break; 
                default:
                    System.out.println("Debe ingresar una opcion valida del Menu");
                    System.out.println("intentelo de nuevo.");
                    System.out.println();
            }
        }while(op1 != 3); 
    }
    /**
     * menu()
     */
    public static void menu(){
        System.out.println("**************************");
        System.out.println("*          Menu          *");
        System.out.println("**************************");
        System.out.println("1. Lista arreglos         ");
        System.out.println("2. Lista circular         ");
        System.out.println("3. Salir                  ");
        System.out.println("**************************");
        System.out.println(                            );
    }
    
    	/**
        * solicita al usuario que ingrese un dato valido
        * en caso contrario manda una excepcion y le indica al usuario
        * que el dato ingresado es incorrecto. 
        * @param mensaje String
        * @param mostrar boolean
        */
    public static double obtenerNumero(String mensaje, boolean mostrar){
        Scanner ingreso = new Scanner(System.in);
        double num = -1;
        
        System.out.print(mensaje);
        try{
            num = ingreso.nextDouble();
        }
        catch(InputMismatchException exception){
            if (mostrar)
                System.out.println("\nERROR: ~~> Dato invalido. :O(\n");
        }
        finally{
            ingreso.nextLine();//Atrapar el ENTER
        }
        return num;
    }
    /**
     * 
     * @param numbers
     * @return numbers int[]
     */
    public static int getValMin(int[] numbers){  
        int minValue = numbers[0]; 
        int ret = 0;

        for(int i=1;i<numbers.length;i++){  
            if(numbers[i] < minValue){  
                minValue = numbers[i];
                ret = i;
            }  
        }  
        return ret;  
    }
    

}